#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct ssnodo
{
	int info;
	struct ssnodo *sig;
}snodo;

typedef snodo *tipolista;

/**********************************************************************/
/*PROTOTIPOS*/
tipolista lista_vacia();		/*Inicializa la lista*/
int es_lista_vacia(tipolista);	   /* Devuelve 1 si esta vacia, 0 si no*/
tipolista inserta_por_cabeza(tipolista, int);
int conta_lista(tipolista);
void muestra_lista(tipolista);
tipolista inserta_por_cola(tipolista, int);
tipolista borra_por_cabeza(tipolista);
tipolista borra_por_cola(tipolista);
int busca_lista(tipolista, int); /* busca un valor en la lista*/
tipolista cambia_nodo(tipolista, int);/* cambia el primer nodo por un numero */
tipolista elimina_numero(tipolista, int);
tipolista posi_nodo(tipolista, int, int);

/**********************************************************************/

tipolista lista_vacia()		/*Inicializa la lista*/
{
	tipolista aux;

	aux=NULL;

	return(aux);
}

int es_lista_vacia(tipolista lista)
{
	int vacia;

	if (lista==NULL)
	{
		vacia=1;
	}
	else
	{
		vacia=0;
	}
	return(vacia);
}

/**********************************************************************/
/*** inserta una lista por cabeza ***/

tipolista inserta_por_cabeza(tipolista lista, int valor)

{
 tipolista aux;
 aux=malloc(sizeof(snodo));
 aux->info=valor;
 aux->sig=lista;
 lista=aux;
 return(lista);
}

/***********************************************************************/
/**** contador para las listas ****/

int conta_lista(tipolista lista)
{
 int conta_l=0;
 tipolista aux;
 aux=lista;

	if (lista==NULL)
	 {
	  conta_l=0;
	 }
	if (lista!=NULL)
	 {
	  conta_l=conta_l+1;
		 while (aux->sig!=NULL)
			{
			 aux=aux->sig;
			 conta_l=conta_l+1;
			}

	 }
  return(conta_l);
}
/***************************************************************/
/*** muestra listas ***/

void muestra_lista(tipolista lista)
{

tipolista aux;
aux=lista;

	if (lista==NULL)
	 {
	  printf ("\n el valor es:NULL");
	 }
	if (lista!=NULL)
	 {
	  while (aux!=NULL)
		{
		 printf ("\n el valor es %d",aux->info);
		 getch();
		 aux=aux->sig;
		}
	 }
}
/******************************************************************/
/**********************************************************************/
/*** inserta una lista por la cola ***/

tipolista inserta_por_cola(tipolista lista, int valor)

{
 tipolista posicion;
 tipolista aux;
 aux=malloc(sizeof(snodo));
 aux->info=valor;
 aux->sig=NULL;

 if (lista==NULL)
	{
		lista=aux;
	}
	 posicion=lista;

 while (posicion->sig!=NULL)
	{
		posicion=posicion->sig;
	}
	posicion->sig=aux;

 return(lista);
}
/****************************************************************/
/***** borra por la cabezera********/
tipolista borra_por_cabeza(tipolista lista)
{

tipolista aux;

if (lista!=NULL)
 {
  aux=lista;
  lista=lista->sig;
  free(aux);
 }
return (lista);
}

/*****************************************************************/
/***** borra por cola ***********/
tipolista borra_por_cola(tipolista lista)
{
tipolista aux;

aux=lista;

if (aux->sig==NULL)
 {
  free(aux->sig);
  lista=NULL;
 }
while (aux->sig->sig!=NULL)
 {
  aux=aux->sig;
 }
 free(aux->sig);
 aux->sig=NULL;
 return (lista);
}

/*******************************************************************/
/************** busca un elemento que se encuentre en la lista *****/
int busca_lista(tipolista lista, int busca)
{
int pertenece=0;
tipolista aux;
aux=lista;

if (lista==NULL)
 {
	printf ("\n No hay numeros en la lista ");
	pertenece=0;
 }
while (aux!=NULL && pertenece==0)
 {
  if (aux->info==busca)
	{
	 pertenece=1;
	}
	aux=aux->sig;
 }
 return (pertenece);
}

/*********************************************************************/
/*** borra el primer nodo de la lista si coincide con el numero del usuario *******/
tipolista cambia_nodo(tipolista lista, int numero)
{
tipolista aux1;
tipolista aux2;
aux1=lista;
aux2=lista->sig;

if (lista==NULL)
 {
  printf ("\n no hay elementos en la lista ");
 }

if (aux2==NULL)
 {
  if (aux1->info==numero)
   {
     aux1=aux2;
     free(lista);
   }
 }
if (aux1->info==numero)
 {
  aux1=aux2;
  free(lista);
 }
return (aux1);
}
/****************************************************************************/
/** elimina un numero que se encuentra en la lista */
tipolista elimina_numero(tipolista lista, int numero)
{
tipolista aux1;
tipolista aux2;

aux1=lista;
aux2=NULL;

while (aux1!=NULL)
 {
  if (aux1->info==numero)
   {
    if (aux2==NULL)
     {
      lista=aux1->sig;
     }
     else
     {
      aux2->sig=aux1->sig;
     }
     free(aux1);
     if (aux2==NULL)
      {
       aux1=lista;
      }
     else
      {
       aux1=aux2->sig;
      }
   }
   else
   {
    aux2=aux1;
    aux1=aux1->sig;
   }
 }
return(lista);
}
/***********************************************************************/
/****** introduce un nuevo nodo en la posicion indicada ***************/
tipolista posi_nodo(tipolista lista, int numero, int posicion)
{
int i;
tipolista aux1;
tipolista aux2;
tipolista nuevo;

aux1=NULL;
aux2=lista;
nuevo=malloc(sizeof(snodo));
nuevo->info=numero;
nuevo->sig=NULL;



if (lista==NULL)
{
  printf ("\n no hay elementos en la lista ");
}

  for (i=0;i<posicion && aux2!=NULL;i++)
   {
    aux1=aux2;
    aux2=aux2->sig;
   }

  nuevo->sig=lista;

  if(aux1==NULL)
  {
   aux1=nuevo;
  }
  else
  {
   aux1->sig=nuevo;
  }


  return(lista);
}










